#ifndef STRUCTURES_DEF
#define STRUCTURES_DEF


//===================DEFINITION DES TYPEDEF ==============================

typedef enum _type_operun {NEG,OPP} Type_operun ;

typedef enum  _type_operbin {PLUS,MOINS,MULT,DIV,MOD,EG,INF,
                SUP,INFE,SUPE,DIFF,ET,OU} Type_operbin;

typedef enum _type_expr {INT, VAR, STR,OPBIN,OPUN} Type_expr;

typedef enum _type_inst {REM,GOTO,LET,PRINT,INPUT,IF} Type_inst;

typedef struct _un_operun Un_operun ;

typedef struct _un_operbin Un_operbin ;

typedef struct _une_expr Une_expr ;

typedef struct _une_inst Une_inst;

typedef struct _une_var Une_var;

typedef struct _un_label Un_label;

typedef struct _un_prog Un_prog;


//===============================DEFNITION DES STRUCTURES================

struct _un_operun
{
        Type_operun type;
        Une_expr *pexpr; //operande
};

struct _un_operbin
{
        Type_operbin type;
        Une_expr *pexpr1; //operande 1
        Une_expr *pexpr2; //operande 2
};

struct _une_expr
{
        Type_expr type;
        int val ;
        Une_var *pvar;
        char *str;
        Un_operun *poperun;
        Un_operbin *poperbin;
};

struct _une_inst
{
        Type_inst type;
        char* rem_str;
        Un_label *branch_lab;
        Une_var *pvar;
        Une_expr *pexpr;
        Une_inst *suiv;
};

struct _une_var
{
        char *nom_var;
        int val_var;
        Une_var *suiv;
};

struct _un_label
{
        char* nom_label;
        Une_inst *pinst;
        Un_label *suiv;
};

struct _un_prog
{
        Une_inst *pinst;
        Une_var *pvar ;
        Un_label *plabel;
};

#endif
